看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起!
题目
有效括号字符串为空 ""
、"(" + A + ")"
或 A + B
,其中 A
和 B
都是有效的括号字符串,+
代表字符串的连接。
- 例如,
""
,"()"
,"(())()"
和"(()(()))"
都是有效的括号字符串。
如果有效字符串 s
非空,且不存在将其拆分为 s = A + B
的方法,我们称其为原语(primitive) ,其中 A
和 B
都是非空有效括号字符串。
给出一个非空有效字符串 s
,考虑将其进行原语化分解,使得:s = P_1 + P_2 + ... + P_k
,其中 P_i
是有效括号字符串原语。
对 s
进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 s
。
示例 1:
1 | 输入:s = "(()())(())" |
示例 2:
1 | 输入:s = "(()())(())(()(()))" |
示例 3:
1 | 输入:s = "()()" |
提示:
1 <= s.length <= 105
s[i]
为'('
或')'
s
是一个有效括号字符串
解题思路
- 我们用
双指针
和栈
的思路 - 用
count
记录剩余没有完成配对的括号数,有(
就count++
,)
就count--
- 一个慢指针用来记录第一个
(
的位置,快指针向后寻找 - 当满足
count==0
时,快慢指针所在位置为最外层括号 - 截取中间的字符串,然后将慢指针放到快指针的下一个
- 循环上述操作
解题代码
1 | var removeOuterParentheses = function(s) { |
如有任何问题或建议,欢迎留言讨论!